﻿using System;
using System.Configuration;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace App_Persistencia
{
    public class Cliente_Data
    {
        private int clienteId;

        public int ClienteId
        {
            get { return clienteId; }
            set { clienteId = value; }
        }

        private string nomCliente;

        public string NomCliente
        {
            get { return nomCliente; }
            set { nomCliente = value; }
        }

        private string apeCliente;

        public string ApeCliente
        {
            get { return apeCliente; }
            set { apeCliente = value; }
        }

        private string calleDirCliente;

        public string CalleDirCliente
        {
            get { return calleDirCliente; }
            set { calleDirCliente = value; }
        }
        private int nroDirCliente;

        public int NroDirCliente
        {
            get { return nroDirCliente; }
            set { nroDirCliente = value; }
        }
        private int pisoDirCliente;

        public int PisoDirCliente
        {
            get { return pisoDirCliente; }
            set { pisoDirCliente = value; }
        }
        private string deptoDirCliente;

        public string DeptoDirCliente
        {
            get { return deptoDirCliente; }
            set { deptoDirCliente = value; }
        }

        private string email;

        public string Email
        {
            get { return email; }
            set { email = value; }
        }

        private int telCliente;

        public int TelCliente
        {
            get { return telCliente; }
            set { telCliente = value; }
        }

        private string sexo;

        public string Sexo
        {
            get { return sexo; }
            set { sexo = value; }
        }

        private int nroDocCliente;

        public int NroDocCliente
        {
            get { return nroDocCliente; }
            set { nroDocCliente = value; }
        }

        private DateTime fechaCreacion;

        public DateTime FechaCreacion
        {
            set { fechaCreacion = value; }
            get { return fechaCreacion; }
        }

        private Barrio_Data bar = new Barrio_Data();

        public Barrio_Data Bar
        {
            get { return bar; }
            set { bar = value; }
        }

        private Usuario_Data usuario;

        public Usuario_Data Usuario
        {
            get { return usuario; }
            set { usuario = value; }
        }

        private Tipo_Docmento_Data tipoDocCliente;

        public Tipo_Docmento_Data TipoDocCliente
        {
            get { return tipoDocCliente; }
            set { tipoDocCliente = value; }
        }



        public DataTable listarPresupuestosCliente(int estado)
        {
            string commandSQL = "SELECT Presupuesto.pre_Id AS Nro, Presupuesto.pre_FechaCreacion AS Fecha, Cliente.cli_Nombre AS Nombre, Cliente.cli_Apellido AS Apellido, Cliente.cli_Email AS Email, Presupuesto.pre_CantPersonas AS CantPersonas, Presupuesto.pre_Observacion AS Observacion "
                              + " FROM Presupuesto INNER JOIN Cliente ON Presupuesto.cliente_Id = Cliente.cli_Id "
                              + " WHERE Presupuesto.cliente_Id = " + ClienteId + " AND Presupuesto.estado_Id = " + estado;

            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, new SqlConnection(conexion));

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Presupuesto");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Presupuesto"];

            return dataTable;
        }


        /*
         * ver si no se tiene que filtrar por algun estado
         */

        public DataTable listaEventosCliente()
        {
            string commandSQL = "SELECT Evento.eve_Id AS Nro, Evento.eve_CantPersonas AS CantPersonas, Evento.eve_FechaEvento AS FechaEvento, Evento.eve_Comentario AS Comentario, Cliente.cli_Nombre AS ClienteNombre, Cliente.cli_Apellido AS ClienteApellido "
                               + " FROM Evento INNER JOIN Cliente ON Evento.cliente_Id = Cliente.cli_Id "
                               + " WHERE Evento.cliente_Id = " + ClienteId;



            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, new SqlConnection(conexion));

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Evento");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Evento"];

            return dataTable;
        }

        public DataView misEventosYMenu()
        {

            //Creo la sentencia SQL
            string commandSQL = "SELECT    DISCTINCT Presupuesto.pre_Id As id_Presupuesto " +
                                "FROM      Presupuesto, Cliente " +
                                "WHERE     Presupuesto.cliente_Id = " + this.clienteId; //+ " OR Evento.eve_Id = " + this.clienteId;


            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Cliente");

            //creo la vista de la consulta
            DataView dataView = new DataView();

            //Cargo la Vista con el contenido de la tabla de resultados
            dataView = dataSet.Tables["Cliente"].DefaultView;

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Cliente"];

            return dataView;

        }

        public void CargarCliente()
        {

            //Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);
            connection.Open();
            SqlTransaction transaccion = connection.BeginTransaction();
            try
            {


                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                command.Transaction = transaccion;
                command.Connection = connection;

                command.CommandText = "spCargarUsuarioCliente";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter param;

                //establesco el parametro @usuario, uso como entrada los atributos de la clase
                param = command.Parameters.AddWithValue("@Usuario", usuario.NomUsuario);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@Password", usuario.Password);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                //establesco el parametro @FechaCreacion
                param = command.Parameters.AddWithValue("@FechaCreacion", fechaCreacion);
                param.DbType = DbType.DateTime;
                param.Direction = ParameterDirection.Input;

                ////establesco el parametro de salida @UsuarioId
                param = command.Parameters.AddWithValue("@UsuarioId", 0);
                param.Direction = ParameterDirection.Output;

                // ejecuto el procedimiento
                command.ExecuteNonQuery();
                //recupero el valor del parametro @UsuarioId
                usuario.UsuarioId = Convert.ToInt32(command.Parameters["@UsuarioId"].Value);


                //aca carga el cliente con el id de usuario que cargo recien


                System.Data.SqlClient.SqlCommand commandCliente = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                commandCliente.Transaction = transaccion;
                //Asingo la conexion al objeto conection
                commandCliente.Connection = connection;
                commandCliente.CommandText = "spCargarCliente";
                commandCliente.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter paramCliente;


                //establesco el parametro @Pregunta
                paramCliente = commandCliente.Parameters.AddWithValue("@Nombre", nomCliente);
                paramCliente.DbType = DbType.String;
                paramCliente.Direction = ParameterDirection.Input;

                //establesco el parametro @Respuesta
                paramCliente = commandCliente.Parameters.AddWithValue("@Apellido", apeCliente);
                paramCliente.DbType = DbType.String;
                paramCliente.Direction = ParameterDirection.Input;

                //establesco el parametro @FechaCreacion
                paramCliente = commandCliente.Parameters.AddWithValue("@FechaCreacion", fechaCreacion);
                paramCliente.DbType = DbType.DateTime;
                paramCliente.Direction = ParameterDirection.Input;

                //establesco el parametro @Telefono
                paramCliente = commandCliente.Parameters.AddWithValue("@Telefono", telCliente);
                paramCliente.DbType = DbType.Int32;
                paramCliente.Direction = ParameterDirection.Input;


                //establesco el parametro @Email
                paramCliente = commandCliente.Parameters.AddWithValue("@Email", email);
                paramCliente.DbType = DbType.String;
                paramCliente.Direction = ParameterDirection.Input;


                //establesco el parametro @Telefono
                paramCliente = commandCliente.Parameters.AddWithValue("@UsuarioId", usuario.UsuarioId);
                paramCliente.DbType = DbType.Int32;
                paramCliente.Direction = ParameterDirection.Input;

                ////establesco el parametro de salida @UsuarioId
                paramCliente = commandCliente.Parameters.AddWithValue("@ClienteId", 0);
                paramCliente.Direction = ParameterDirection.Output;

                // ejecuto el procedimiento
                commandCliente.ExecuteNonQuery();
                //recupero el valor del parametro @UsuarioId
                clienteId = Convert.ToInt32(commandCliente.Parameters["@ClienteId"].Value);

                transaccion.Commit();

            }
            catch (SystemException e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);

                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }
        }

        public void updateCliente()
        {

            //Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);
            connection.Open();
            SqlTransaction transaccion = connection.BeginTransaction();
            try
            {

                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                command.Transaction = transaccion;
                command.Connection = connection;

                command.CommandText = "spUpdateCliente";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter param;

                //establezco el parametro @usuario, uso como entrada los atributos de la clase
                param = command.Parameters.AddWithValue("@Nombre",this.NomCliente);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@Apellido", this.ApeCliente);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                //establesco el parametro @FechaCreacion
                param = command.Parameters.AddWithValue("@BarrioId", this.Bar.Id);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                ////establesco el parametro de salida @UsuarioId
                param = command.Parameters.AddWithValue("@Calle", this.CalleDirCliente);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@Numero", this.nroDirCliente);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@Depto", this.DeptoDirCliente);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@Email", this.Email);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@Telefono", this.TelCliente);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@Documento", this.NroDocCliente);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@TipoDocId", this.TipoDocCliente.Id);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@Sexo", this.Sexo);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@Piso", this.PisoDirCliente);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@ClienteId",this.ClienteId);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                // ejecuto el procedimiento
                command.ExecuteNonQuery();
               
                transaccion.Commit();

            }
            catch (SystemException e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);

                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }
        }
    }
}